#include "link_list.h"

int main(int argc, const char *argv[]){
    node_t *phead = NULL; // 保存头结点的首地址
    // 创建头结点
    create_node(&phead, -1);
    printf("phead = %p\n", phead); // 非NULL

    // 测试头插
    insert_list_by_head(phead, 10);
    insert_list_by_head(phead, 20);
    insert_list_by_head(phead, 30);
    insert_list_by_head(phead, 40);
    print_list(phead); // 40 30 20 10

    // 测试尾插
    insert_list_by_tail(phead, 50);
    insert_list_by_tail(phead, 60);
    insert_list_by_tail(phead, 70);
    print_list(phead); // 40 30 20 10 50 60 70

    // 测试任意位置插入
    insert_list_by_pos(phead, 8, 100); // 报错 位置不合理
    insert_list_by_pos(phead, 7, 200);
    insert_list_by_pos(phead, 2, 300);
    print_list(phead); // 40 30 300 20 10 50 60 70 200

    // 测试头删
    delete_list_by_head(phead);
    delete_list_by_head(phead);
    delete_list_by_head(phead);
    print_list(phead); // 20 10 50 60 70 200

    // 测试尾删
    delete_list_by_tail(phead);
    delete_list_by_tail(phead);
    print_list(phead); // 20 10 50 60

    // 测试任意位置删除
    delete_list_by_pos(phead, 4); // 位置不合理  报错
    delete_list_by_pos(phead, 3);
    delete_list_by_pos(phead, 1);
    print_list(phead); // 20 50

    insert_list_by_tail(phead, 30);
    insert_list_by_tail(phead, 40);
    insert_list_by_tail(phead, 10);
    print_list(phead); // 20 50 30 40 10

    // 测试查找
    int num = 0;
    int ret = 0;
    ret = search_list_by_pos(phead, 5, &num); // 报错 位置不合理
    printf("ret = %d  num = %d\n", ret, num); // -1  
    ret = search_list_by_pos(phead, 4, &num);
    printf("ret = %d  num = %d\n", ret, num); // 0  10
    ret = search_list_by_pos(phead, 2, &num);
    printf("ret = %d  num = %d\n", ret, num); // 0  30
    
    // 测试修改
    print_list(phead); // 20 50 30 40 10
    modify_list_by_pos(phead, 5, 100); // 报错 位置不合理
    modify_list_by_pos(phead, 4, 200);
    modify_list_by_pos(phead, 2, 300);
    print_list(phead); // 20 50 300 40 200

    // 测试清空
    clean_list(phead);
    print_list(phead); // 没有元素了

    // 测试销毁
    destroy_list(&phead);
    printf("phead = %p\n", phead); // NULL

    // 测试合并
    create_node(&phead, -1);
    insert_list_by_tail(phead, 40);
    insert_list_by_tail(phead, 20);
    insert_list_by_tail(phead, 80);
    insert_list_by_tail(phead, 10);
    node_t *phead2 = NULL;
    create_node(&phead2, -1);
    insert_list_by_tail(phead2, 30);
    insert_list_by_tail(phead2, 60);
    insert_list_by_tail(phead2, 70);
    insert_list_by_tail(phead2, 50);
    hebing_list(phead, &phead2);
    print_list(phead); // 40 20 80 10 30 60 70 50
    printf("phead2 = %p\n", phead2); // NULL

    // 测试排序
    sort_list(phead);
    print_list(phead); // 10 20 30 40 50 60 70 80

    // 测试翻转
    overtrun_list(phead);
    print_list(phead); // 80 70 60 50 40 30 20 10

    // 测试剔重
    insert_list_by_pos(phead, 2, 80);
    insert_list_by_pos(phead, 5, 80);
    insert_list_by_pos(phead, 5, 80);
    insert_list_by_tail(phead, 80);
    insert_list_by_tail(phead, 80);
    insert_list_by_pos(phead, 4, 10);
    insert_list_by_tail(phead, 520);
    insert_list_by_tail(phead, 520);
    print_list(phead); // 80 70 80 60 10 50 80 80 40 30 20 10 80 80 520 520
    tichong_list(phead);
    print_list(phead); // 80 70 60 10 50 40 30 20 520

    return 0;
}